package com.tensquare.auth.service.impl;

import cn.hutool.core.util.IdUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.tensquare.auth.client.UserClient;
import com.tensquare.auth.config.WeiboProperties;
import com.tensquare.auth.service.AuthService;
import com.tensquare.auth.util.HttpUtils;
import com.tensquare.auth.vo.WeboVo;
import com.tensquare.domain.User;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * ------------------------------
 * 功能：
 * 作者：WF
 * 微信：hbxfwf13590332912
 * 创建时间：2021/9/2-16:31
 * ------------------------------
 */
@Service
public class AuthServiceImpl implements AuthService {

    @Autowired
    private WeiboProperties wb;
    @Autowired
    private UserClient userClient;
    /**
     * 功能:
     * 1、向微博发出请求，得到access_token及uid的值
     * 2、根据access_token及uid的值，得到用户信息
     * 3、将上述信息保存到数据库tb_user中(openfein进行微服务调用)
     *
     * 参数:
     * 返回值: void
     * 时间: 2021/9/2 16:31
     * @return
     */
    @Override
    public User sendWeibo(String code) throws Exception {
        //1. 设置请求体参数
        Map<String, String> bodys = new HashMap<>();
        bodys.put("client_id",wb.getClientId());
        bodys.put("client_secret",wb.getClientSecret());
        bodys.put("grant_type",wb.getGrantType());
        bodys.put("redirect_uri",wb.getRedirectUri());
        bodys.put("code",code);

        //2. 发送请求,返回响应对象
        //第一步：根据code换取access_token的值
        HttpResponse httpResponse = HttpUtils.doPost(wb.getHost(), wb.getAccessTokenPath(), "post", new HashMap<>(), new HashMap<>(), bodys);
        if(httpResponse.getStatusLine().getStatusCode() == 200){        //代表执行成功
            //2.1 得到响应体对象
            HttpEntity entity = httpResponse.getEntity();
            //2.2 转换成字符串
            String str = EntityUtils.toString(entity);
            //2.3 转换为WeiboVo对象
            WeboVo weboVo = JSON.parseObject(str, WeboVo.class);

            //第二步：根据access_token及uid的值得到微博中的个人信息
            //2.4 向微博发送请求得到个人信息
            Map<String, String> querys = new HashMap<>();
            querys.put("access_token",weboVo.getAccessToken());
            querys.put("uid",weboVo.getUid());
            HttpResponse getResponse = HttpUtils.doGet(wb.getHost(), wb.getUserInfoPath(), "get", new HashMap<>(), querys);
            //2.5 如果发送成功，就得到个人信息并保存到数据库中
            if(getResponse.getStatusLine().getStatusCode() == 200){ //发送成功
                //2.5.1 得到微博返回的用户信息
                HttpEntity userEntity = getResponse.getEntity();        //得到用户信息
                String userInfoStr = EntityUtils.toString(userEntity);  //得到用户信息字符串
                JSONObject jsonObject = JSON.parseObject(userInfoStr);  //转换为jsonObject，相当于Map
                String  name = (String) jsonObject.get("name");         //昵称
                String gender = (String) jsonObject.get("gender");      //性别

                //2.5.2 根据uid在tb_user表中查询是否有此记录，如果没有就添加，否则，就修改
                User myUser = userClient.findByUid(weboVo.getUid());
                if(myUser == null){     //如果数据库没有此记录就添加
                    //2.5.2 将用户信息添加到数据库中
                    //① 构造用户对象，并添加到数据库中
                    User user = new User();
                    user.setId(IdUtil.createSnowflake(0,1).nextIdStr());
                    user.setAccessToken(weboVo.getAccessToken());
                    user.setNickname(name);
                    user.setSex(gender);
                    user.setUid(weboVo.getUid());
                    user.setLastdate(new Date());
                    userClient.insert(user);
                    return user;
                }else{                 //如果有此记录就进行修改
                    myUser.setUpdatedate(new Date());
                    myUser.setAccessToken(weboVo.getAccessToken());
                    myUser.setExpiresIn(weboVo.getExpiresIn());
                    userClient.update(myUser);
                    return myUser;
                }

            }

        }
        return null;

    }
}
